package com.bt7274.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

/**
 * 密码工具类
 * 提供密码加密和验证的便捷方法
 */
@Component
public class PasswordUtils {

    @Autowired
    private PasswordEncoder passwordEncoder;

    /**
     * 加密密码
     *
     * @param rawPassword 原始密码
     * @return 加密后的密码
     */
    public String encode(String rawPassword) {
        return passwordEncoder.encode(rawPassword);
    }

    /**
     * 验证密码
     *
     * @param rawPassword 原始密码
     * @param encodedPassword 加密后的密码
     * @return 是否匹配
     */
    public boolean matches(String rawPassword, String encodedPassword) {
        return passwordEncoder.matches(rawPassword, encodedPassword);
    }

    /**
     * 检查密码强度
     *
     * @param password 密码
     * @return 密码强度等级 (0-4)
     */
    public int checkPasswordStrength(String password) {
        if (password == null || password.length() < 6) {
            return 0; // 弱
        }

        int score = 0;

        // 长度检查
        if (password.length() >= 8) score++;
        if (password.length() >= 12) score++;

        // 包含数字
        if (password.matches(".*\\d.*")) score++;

        // 包含小写字母
        if (password.matches(".*[a-z].*")) score++;

        // 包含大写字母
        if (password.matches(".*[A-Z].*")) score++;

        // 包含特殊字符
        if (password.matches(".*[!@#$%^&*()_+-=\\[\\]{};':\"\\\\|,.<>/?].*")) score++;

        // 返回强度等级（0-4）
        return Math.min(4, score - 1);
    }

    /**
     * 获取密码强度描述
     *
     * @param password 密码
     * @return 强度描述
     */
    public String getPasswordStrengthDescription(String password) {
        int strength = checkPasswordStrength(password);
        switch (strength) {
            case 0:
                return "极弱";
            case 1:
                return "弱";
            case 2:
                return "中等";
            case 3:
                return "强";
            case 4:
                return "极强";
            default:
                return "未知";
        }
    }

    /**
     * 验证密码格式是否符合要求
     *
     * @param password 密码
     * @return 是否符合要求
     */
    public boolean isValidPassword(String password) {
        if (password == null) {
            return false;
        }

        // 基本长度要求：6-20位
        if (password.length() < 6 || password.length() > 20) {
            return false;
        }

        // 至少包含一个字母和一个数字
        boolean hasLetter = password.matches(".*[a-zA-Z].*");
        boolean hasDigit = password.matches(".*\\d.*");

        return hasLetter && hasDigit;
    }

    /**
     * 生成随机密码
     *
     * @param length 密码长度
     * @return 随机密码
     */
    public String generateRandomPassword(int length) {
        if (length < 6) {
            length = 6;
        }

        String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*";
        StringBuilder password = new StringBuilder();

        // 确保包含至少一个大写字母、小写字母、数字和特殊字符
        password.append(chars.charAt((int) (Math.random() * 26))); // 大写字母
        password.append(chars.charAt(26 + (int) (Math.random() * 26))); // 小写字母
        password.append(chars.charAt(52 + (int) (Math.random() * 10))); // 数字
        password.append(chars.charAt(62 + (int) (Math.random() * 8))); // 特殊字符

        // 填充剩余长度
        for (int i = 4; i < length; i++) {
            password.append(chars.charAt((int) (Math.random() * chars.length())));
        }

        // 打乱字符顺序
        return shuffleString(password.toString());
    }

    /**
     * 打乱字符串顺序
     *
     * @param str 原字符串
     * @return 打乱后的字符串
     */
    private String shuffleString(String str) {
        char[] chars = str.toCharArray();
        for (int i = chars.length - 1; i > 0; i--) {
            int j = (int) (Math.random() * (i + 1));
            char temp = chars[i];
            chars[i] = chars[j];
            chars[j] = temp;
        }
        return new String(chars);
    }
}